<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="UTF-8">
    <title>Sucha's Blog - Archive for May, 2020</title>
    <meta name="generator" content="MarkdownProjectCompositor.lua">
    <meta name="author" content="Sucha">
    <meta name="keywords" content="suchang, programming, Linux, Lua">
    <meta name="description" content="Sucha's blog">
    <link rel="shortcut icon" href="../images/ico.png">
    <link rel="stylesheet" type="text/css" href="../styles/blog.css">
    <link rel="stylesheet" type="text/css" href="../styles/prism.min.css">
    <style id="site_theme"></style>
  </head>
  <body>
    <div id="body">
      <div id="text">
	   <!-- Page published by cmark-gfm begins here --><h1>Sucha's Blog ~ Archive for May, 2020</h1>
<p><a id="p3"></a></p>
<div class="date">20年5月23日 周六 08:56</div>
<h2>修改 m_net 在 Windows 下使用 ewpoll 作为底层事件通知</h2>
<p>之前 <a href="https://github.com/lalawue/m_net">m_net</a> 在 Windows 下是使用 select 作为 socket 事件检测接口，效率差是一方面，主要是其他更主要的服务端平台，比如 Linux/FreeBSD，以及开发常用的 MacOS，是另外一套相近的 API。</p>
<p>比如不管是 epoll 或者 kqueue，通过接口，可以返回一个当前时间片段内有事件发生的 socket 列表，以及 socket 对应的 ptr，用来绑定这个 socket 对应的内部结构。添加、删除 socket 事件列表的方法也相近。</p>
<p>然而 Windows 这边，因为用了线性的 select，内部数据结构映射方面，每次监听前，都得添加事件响应参数，又得单独处理，麻烦了很多。</p>
<p>后面介绍的这个 <a href="https://github.com/piscisaureus/wepoll">wepoll</a>，是在 Windows 下实现了 epoll 的接口，对那些志在跨平台的网络库来说，简单点只需要面对 epoll、kqueue 的区别就好了，而这两者很相近啊。</p>
<p>所以稍微修改了一下，m_net 就支持上了，另外还修复了一个大 bug，epoll_wait 接口的参数是 milliseconds 的，而 kqueue 的接口参数是 microseconds 的，fix 了一下。</p>
<p>然后跑了 test_reconnect、test_rwdata、test_timer 几个端对端的测试程序，完美应用。当然回头又跑了一遍 Linux、FreeBSD、MacOS 的下的端对端测试。</p>
<p>话说 <a href="https://github.com/piscisaureus/wepoll">wepoll</a> 在 Windows 下使用的也是 IOCP 对应的接口，不过没有使用到多线程，而是使用了 SetFileCompletionNotificationModes 函数取消端口操作完成后的异步通知，然后使用 NtDeviceIoControlFile 来获取端口的完成状态，这样就将异步事件转成同步的了。</p>
<p>另外一个部分，是将 epoll 相关接口的数据结构映射到 Windows 相关数据结构里面，大概就是这样。</p>
<p>很想说 NtDeviceIoControlFile 在 bing 上面都搜不到什么中文信息，蛋疼。</p>
<div class="category"><a href="CategoryProgramming.html">CategoryProgramming</a> / <a href="2020-05.html#p3">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<p><a id="p2"></a></p>
<div class="date">20年5月17日 周日 11:28</div>
<h2>改用 Visual Studio Code 作为编辑器</h2>
<p>为了应用上 VSCode 的 <a href="https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one">Markdown All in One</a>，之前诸如 2020-05 这样的文件名，都修改为 2020-05.md 了。对于整站来说，算是很大的改变，虽然实际的操作只是一条普通的 find 命令。</p>
<p>之前使用的基于浏览器的版本自动变为备份选项了。</p>
<p>VSCode 的 Markdown 功能比如 preview 很方便，另外各种加载、保存操作效率要高很多，而且还是全平台支持（Win、Mac、Linux），因此用了几次之后，就下定决心切换了。但是有个前提，也许是 VSCode 编辑器框架的配置，要进入各种 Markdown 功能，需要识别这个文件为 Markdown，在 VSCode 里面，是通过判断文件名的后缀为 .md 做到的。</p>
<p>为此修修补补了 MarkdownProjectCompositor 以及配置文件，之前验证了一下 html 的输出都没变化，算是验收通过了。</p>
<p>先补个图：</p>
<p><img src="../images/vscode_markdown_all_in_one.jpg" alt="使用VSCode的截图"></p>
<div class="category"><a href="CategoryThisSite.html">CategoryThisSite</a> / <a href="2020-05.html#p2">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<p><a id="p1"></a></p>
<div class="date">20年5月17日 周日 11:24</div>
<h2>MarkdownProjectCompositor 加入文件名映射配置</h2>
<p>之前的 <a href="https://github.com/lalawue/MarkdownProjectCompositor">MarkdownProjectCompositor</a> 仅仅支持在 config.lua 配置文件中设置 suffix 为 &quot;.html&quot; 这样的，其实很不方便，特别是如果文件后缀名为 &quot;.md&quot; 的时候，就会很尴尬。</p>
<p>所以重新配置了下面的映射函数来做这层转换</p>
<pre><code class="language-lua">destname = function(input_name)
    return output_name
end
</code></pre>
<p>为了适应这个变化，之前主站、blog 目录的好些自动生成文件的功能都得做调整，毕竟之前只有一层以映射，现在多了一层映射，要配置过来，还好，2 个小时就搞定了。</p>
<p>话说，着应该是很普遍的功能，为啥之前没有想到呢。</p>
<div class="category"><a href="CategoryProgramming.html">CategoryProgramming</a> / <a href="2020-05.html#p1">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<p><a id="p0"></a></p>
<div class="date">20年5月17日 周日 11:12</div>
<h2>mon_sched 支持 kill child process</h2>
<p>mon_shced 升级到了 1.3.4，支持 kill 掉 group process 中的某个 child process，同时也支持单独输出某个 child process 的 pid 到指定目录下。</p>
<p>先列一下功能：</p>
<pre><code class="language-bash">Usage:
mon_sched -h                             show help
mon_sched -v                             show version
mon_sched -r sched_json                  run group process from config
mon_sched -s pid_json                    show group and child status
mon_sched -k pid_json [child_name]       kill [group | child] process
</code></pre>
<p>第二个功能先不表，也不知道为啥头脑发热做了第二个功能，说一下第一个功能吧。</p>
<p>之前 mon_sched 只支持 supervision，后来加了 -k 选项，可以关闭管理的整个 process group，这里只是方便了一点，不用自己再使用 kill 指令安排了。主要的应用场景，是为了在远程控制时，将固定的配置文件名，作为 mon_sched 的参数，让整个 process group 下线。</p>
<p>加入第一个功能 kill child process 后，结合本来每个 child process 可以配置其 restart 脚本内容这个功能，可以做到让服务更新，之后再重启。由于 mon_sched 没有什么依赖，因此这样的重启可以做到 child process 二进制依赖的切割。</p>
<p>我自测的结果，即便 mon_sched 在当前目录运行配置文件，restart 脚本删除并重新建立这个目录，mon_sched 重新拉起服务的过程中，仍能定位到这个目录，前提当然是目录名称未变。感觉，在文件系统当前目录这一层，也是没有变化的。</p>
<p>有了这样的加持，方便多了。</p>
<div class="category"><a href="CategoryProgramming.html">CategoryProgramming</a> / <a href="2020-05.html#p0">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<!-- Page published by cmark-gfm ends here -->
  <div id="foot">2004-<script>var d = new
	Date();document.write(d.getFullYear())</script> &copy;
	Sucha. Powered by MarkdownProjectCompositor.
  </div>
  </div><!-- text -->
  <div id="sidebar">
  </div><!-- sidebar -->
  <script src="../js/prism.min.js" async="async"></script>
  <script src="../js/blog_sidebar.js"></script>
  </div> <!-- body -->
</body>
</html>